﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using MMessaging.MessagingEx.Common;

namespace MMessaging.Address
{
	/// <summary>
	/// Beispiel einer simplen Basisklasse für adressbezogene Messages.
	/// Adressbezogene Messages müssen nicht von dieser Basisklasse abgeleitet sein !
	/// Adressbezogene Messages müssen aber immer das Interface 
	/// IMAddressMessage implementieren.
	/// </summary>
	public abstract class MAddressMessageBase : IMAddressMessage, IMDebugableMessage
	{
		/// <summary>
		/// true, wenn diese Message verfolgt werden soll: 
		/// Die Methoden WaitOnMessage werden stoppen, wenn sie diese Message
		/// verarbeiten.
		/// </summary>
		private bool __break = false;

		public MAddress Receiver { get; set; }
		public MAddress Sender { get; set; }
		/// <summary>
		/// UTC Zeit
		/// </summary>
		public DateTime SendTime { get; set; }
		/// <summary>
		/// Identifiziert die Message - (nicht den Messag-Typ)
		/// </summary>
		public Guid MessageID { get; set; }

		/// <summary>
		/// Konstruktor
		/// </summary>
		/// <param name="receiver"></param>
		/// <param name="sender"></param>
		/// <param name="sendTime"></param>
		public MAddressMessageBase(
			MAddress receiver,
			MAddress sender,
			DateTime sendTime
			)
		{
			Receiver = receiver;
			Sender = sender;
			SendTime = sendTime;
			MessageID = Guid.NewGuid();
		}
		/// <summary>
		/// true, wenn diese Message verfolgt werden soll: 
		/// Die Methoden WaitOnMessage werden stoppen, wenn sie diese Message
		/// verarbeiten.
		/// </summary>
		bool IMDebugableMessage.Break
		{
			get
			{
				return __break;
			}
			set
			{
				__break = value;
			}
		}

		public override string ToString()
		{
			if ( this == null )
				return "null";
			return string.Format(
				"{0} - sender:{1}",
				GetType().Name,
				Sender.AddressDataAsASCII
				);
		}
	}
}
